<?php

/**
 * @author chenshubo
 * 菜鸟
 */
namespace App\Service\OrderService\OrderRouteService;
use App\Model\CommodityModel\SupplierCommodity;
use App\Service\Code\Normal;
use App\Model\PssModel\OrderSupplier;
use Service\AppService\IdService;
use App\Model\CommodityModel\SupplierCompany;
use App\Service\OrderService\BaseSupplierRouterService;
use App\Service\VendorClient\ShopCaiNiao\ShopCaiNiaoCcApiClient;

class Shopcainiaocc extends BaseSupplierRouterService
{
    /**
     * 创建订单
     * @param array $param
     * @return mixed
     */
    public function createOrder( $param = [] )
    {
        //下单商品重组
        $supplierGoodsInfo  = $param['supplierGoodsInfo'];
        $userGoodsList      = $supplierGoodsInfo['userGoodsList'];
        $goodsList          = $supplierGoodsInfo['goodsList'];
        $orderItems = [];

        //根据defaultStock分组
        $defaultStockGroupGoodsList = [];
        foreach ($goodsList as $item ) {
            $defaultStockGroupGoodsList[$item['defaultStock']][] = $item;
            unset($item);
        }

        //下游是否申报
        $isDelare = (
            (isset($param['order']['isOrderDeclare']) && $param['order']['isOrderDeclare'] == 1) ||
            (isset($param['order']['isPayDeclare']) && $param['order']['isPayDeclare'] == 1)
            ) ? true : false;

        //是否云仓商城
        $isShop = isset($param['order']['isSplitOrder']) && $param['order']['isSplitOrder'] == 1 ? true : false ;

        //按照上游仓库进行拆单
        foreach ($defaultStockGroupGoodsList as $item )
        {
            //重新合并每一个仓库商品
            $orderGoods = [];
            foreach ($item as $goods ) {
                $orderGoods = array_merge($orderGoods,$userGoodsList[$goods['skuCode']]);
                unset($goods);
            }

            //生成供应商主单号
            $supplierCode = $param['supplierGoodsInfo']['supplierCode'];
            $param['order']['supplier_psn'] = OrderSupplier::instance()->getCreateOrderSn($supplierCode);
            $param['order']['supplier_csn'] = IdService::instance()->getOtherID();
            //下游已申报，则使用下游的订单号作为中台子单号
            if( $isDelare && !$isShop ) {
                $param['order']['supplier_dsn'] = $param['order']['orderSn'];
            } else {
                $param['order']['supplier_dsn'] = IdService::instance()->getOtherID();
            }

            $param['order']['goods'] = $orderGoods;
            $res = OrderSupplier::instance()->getSupplierCreateOrderData($param);
            if( $res['code'] != Normal::SUC ) {
                return $res;
            }

            $orderItems[] = $res['data'];
        }

        return Normal::returnCode(Normal::SUC,"获取成功",[
            'supplierCode' => $supplierCode,
            'orderItems' => $orderItems
        ]);
    }

    /**
     * 订单申报
     * @param array $param
     * @return mixed
     */
    public function orderPay( $param = [] )
    {
       return $this->callSdkApi(ShopCaiNiaoCcApiClient::class,$param['apiBody'])->createOrder($param);
    }

    /*
     * 获取指定供应商商品数据
     */
    public function getOtherSupplierGoodsBySupplierCodeAndSkuCodes( string $supplierCode, array $skuCodes = [] )
    {
        $alias_stock_table = SupplierCompany::instance()->getTable();
        $list = SupplierCompany::instance()
        ->from($alias_stock_table." as s")
        ->select([
            "stock.BatchID",
            "scb.SupplierCommoditySkuCode"
        ])
        ->join("suppliercommodity_s2b as scb","scb.SupplierCompanyID","=","s.ID")
        ->join("stockinfo_s2b as stock",function($join){
            $join->on("stock.SupplierCommodityID","=","scb.ID")
            ->on("stock.SupplierCompanyID","=","s.ID");
        })
        ->where('s.SupplierCode',$supplierCode)
        ->whereIn('scb.SupplierCommoditySkuCode',$skuCodes)
        ->get()
        ->toArray();
        return array_column($list,'BatchID','SupplierCommoditySkuCode');//随机抽一个批次
    }

    /**
     * 订单取消
     * @param array $param
     * @return mixed
     */
    public function orderCancel( $param = [] )
    {
        return Normal::returnCode(Normal::SUC,"处理完成");
    }

    /**
     * 订单售后
     * @param array $param
     * @return mixed
     */
    public function orderAfterSale( $param = [] )
    {
       return $this->callSdkApi(ShopCaiNiaoCcApiClient::class,$param['apiBody'])->cancelOrder($param);
    }

    /**
     * 获取物流信息
     * @param array $param
     */
    public function orderExpress( $param = [] )
    {
        $supplierExpress = $this->callSdkApi(ShopCaiNiaoCcApiClient::class,$param['apiBody'])->queryOrder([
            'orderSnLists' => [$param['supplier_dsn']]
        ]);
        if( $supplierExpress['code'] != Normal::SUC ) {
            return Normal::returnCode(Normal::FAIL,$supplierExpress['msg']);
        }

        if( empty($supplierExpress['data']) ) {
            return Normal::returnCode(Normal::FAIL,"还未发货");
        }

        sleep(1);
        $ships = current($supplierExpress['data'])['Packages'];

        $ExpressName = implode(",", array_column($ships,'ExpressName'));
        $TrackingNo  = implode(",", array_column($ships,'TrackingNo'));
        return  Normal::returnCode(Normal::SUC,"已发货",[
            'expressInfo' => [
                'express_name'  => $ExpressName,
                'express_sn'    => $TrackingNo,
            ]
        ]);
    }


    /**
     * 商品列表查询接口
     * @param array $param
     * @return mixed
     */
    public function queryGoodsList( $param = [] )
    {
        /**
         *  这里需要判断类型
         *  type 1=更新库存 2=拉商品 3=无操作
         *  mode 1=直连 2=菜园
         */
        $type=$param['apiBody']['type']??3;
        $mode=$param['apiBody']['mode']??1;
        if ($type==3){
            return Normal::returnCode(Normal::SUC,"获取成功",[
                'total' =>  0,
                'list'  =>  []
            ]);        
        }
        //判断菜鸟的模式
        $res = $this->callSdkApi(ShopCaiNiaoCcApiClient::class,$param['apiBody'])->{__FUNCTION__}($param['queryBody']);
        if( $res['code'] != Normal::SUC ) {
            return $res;
        }
        $list=$res['data']['itemList']['item']??[];
//        $list=$res['data']['batchInventoryList']['batchInventory']??[];
        //判断是否更新库存模式
        if (empty($list)){
            $is_end=true;
        }else{
            $is_end=false;
        }
        //菜园模式
        if ($mode==2){
            //查询该供应商的商品
            $newList=[];
            if ($list){
                $mapData=SupplierCommodity::instance()->getKeyAndBarCode($param['queryBody']['supplierID']);
                $itemCodeMap=array_column($list,NULL,'itemId');
                $barCodeMap=array_column($list,NULL,'barCode');
                foreach ($mapData as $mapDatum){
                    if (isset($itemCodeMap[$mapDatum['SupplierCommodityKey']])){
                        $itemCodeMap[$mapDatum['SupplierCommodityKey']]['itemId']=$mapDatum['SupplierCommoditySkuCode'];
                        $newList[]=$itemCodeMap[$mapDatum['SupplierCommodityKey']];
                    }
                    elseif (isset($barCodeMap[$mapDatum['SupplierCommodityInternationBarCode']])){
                        $barCodeMap[$mapDatum['SupplierCommodityInternationBarCode']]['itemId']=$mapDatum['SupplierCommoditySkuCode'];
                        $newList[]=$barCodeMap[$mapDatum['SupplierCommodityInternationBarCode']];
                    }
                }
                $list=$newList;
            }
        }
        
        
        return Normal::returnCode(Normal::SUC,"获取成功",[
            'total' => $res['data']['totalCount'] ?? 0,
            'list'  => $list,
            'is_end'=> $is_end
        ]);
    }
}